namespace test08 {
    // symbol 类型 返回唯一的值 只支持 string 和 number类型的参数

    let sym1 = Symbol()
    console.log(sym1); // Symbol()

    let sym2 = Symbol('key'); // 可选的字符串key
    console.log(sym2); // Symbol(key)


    let obj1 = {
        [sym1]: 'df',
        [sym1]: 'asd',
        [sym1]: 'hdf',
    }
    console.log('obj1', obj1); //  { [Symbol()]: 'hdf' }

    // 用作对象属性的键
    let sym3 = Symbol();
    let obj2 = {
        [sym3]: 'value'
    };

    console.log(obj2); // { [Symbol()]: 'value' }
    console.log(obj2[sym3]); // value

    // 使用symbol定义的属性，是不能通过如下方式遍历拿到的
    const symbol1 = Symbol('666')
    const symbol2 = Symbol('777')
    const obj3 = {
        [symbol1]: '小满',
        [symbol2]: '二蛋',
        age: 19,
        sex: '女'
    }
    // 1、for in 遍历
    for (const key in obj3) {
        console.log('key', key);
        // 只能遍历出age、sex，没有遍历到symbol1、2
    }

    // 2、Object.keys 遍历
    Object.keys(obj3)
    console.log(Object.keys(obj3)); // [ 'age', 'sex' ]
    // 还是没有遍历到symbol

    // 3、getOwnPropertyNames
    console.log(Object.getOwnPropertyNames(obj3)); // [ 'age', 'sex' ]

    // 4、JSON.stringify(obj3)
    console.log(JSON.stringify(obj3)); // {"age":19,"sex":"女"}


    // 上述四种假设方法都不能拿到具体的symbol

    // 那如何拿到

    // 1、拿到具体的symbol 属性，对象中有几个就会拿到几个
    Object.getOwnPropertySymbols(obj3)
    console.log(Object.getOwnPropertySymbols(obj3)); // [ Symbol(666), Symbol(777) ]

    // 2、es6 的Reflect 拿到对象的所有属性
    Reflect.ownKeys(obj3)
    console.log(Reflect.ownKeys(obj3));
    // [ 'age', 'sex', Symbol(666), Symbol(777) ]


    // Symbol.iterator 迭代器和生成器 for of
    // 支持遍历大部分类型迭代器 arr nodeList arguments set map 等
    let arr = [1, 2, 3, 4];
    let iterator: IterableIterator<number> = arr[Symbol.iterator]();
    console.log(iterator); // Object [Array Iterator] {}
    console.log(iterator.next()); // { value: 1, done: false }
    console.log(iterator.next()); // { value: 2, done: false }
    console.log(iterator.next()); // { value: 3, done: false }
    console.log(iterator.next()); // { value: 4, done: false }
    console.log(iterator.next()); // { value: undefined, done: true }

    // 测试用例
    interface Item {
        age: number,
        name: string
    }

    const array: Array<Item> = [
        { age: 23, name: '1' },
        { age: 23, name: '2' },
        { age: 23, name: '3' },
    ]

    type mapTypes = string | number
    const map: Map<mapTypes, mapTypes> = new Map()

    map.set('1', '王爷')
    map.set('2', '路北')

    const obj4 = {
        aaa: 123,
        bbb: 4576
    }

    let set: Set<number> = new Set([1, 2, 3, 4, 5, 6])
    let it: Iterator<Item> = array[Symbol.iterator]()
    const gen = (erg: any): void => {
        let it: Iterator<any> = erg[Symbol.iterator]()
        let next: any = { done: false }
        while (!next.done) {
            console.log(next.value);

        }
    }
    gen(array)




}